<?php
/**
 * Класс Controller_Ajax_Message отвечает за обработку ajax-запросов, связанных с перепиской польхователей
 * @author Mike
 */
class Controller_Ajax_Message extends Controller_Ajax {
	
	public function actionSwitch() {
		switch ($this->arrRequest[2]) {
			case 'make-read' : 
				$this->actionMakeRead();
				break;
			case 'del' :
				$this->actionDeleteMessage();
				break;
			case 'new' :
				$this->actionNewMessage();
				break;
			default:
				$this->setError(404);
				break;
		}
	}
	
	/**
	 * Отмечает сообщение как прочитанное
	 */
	private function actionMakeRead() {
		$objDB = Service_Database::instanse();
		$messageId = isset($_POST['ID_message']) ? Service_Escape::absolutelyEscapeString($_POST['ID_message']) : '';
		$currentUserId = User_Seance::getId();
		
		if (empty($messageId)) return $this->makeStandardError('Не получены данные');
		
		$objMessage = new Message($messageId);
		
		// Если нет такого сообщения или пользователь незарегистрирован или это сообщение отмечено как удалённое
		if(!$currentUserId || !$objMessage->id || $objMessage->getField('del_by_user_to')) return $this->makeStandardError('Ошибка');
		
		// Если пользователь пытается отметить не своё сообщение или сообщение уже прочитанное
		if($currentUserId != $objMessage->getField('ID_user_to') || $objMessage->getField('is_read_at')) return $this->makeStandardError('Недопустимое действие');
		
		if($objMessage->updateFields(array('is_read_at' => gmdate("Y-m-d H:i:s", time())))) $this->arrReturn = array('result' => 'OK');
	}
	
	/**
	 * Отмечает сообщение как удалённое соответствующим пользователем
	 */
	private function actionDeleteMessage() {
		$objDB = Service_Database::instanse();
		$messageId = isset($_POST['ID_message']) ? Service_Escape::absolutelyEscapeString($_POST['ID_message']) : '';
		$currentUserId = User_Seance::getId();
	
		if (empty($messageId)) return $this->makeStandardError('Не получены данные');
	
		$objMessage = new Message($messageId);
	
		// Если пользователь незарегистрирован или нет такого сообщения
		if(!$currentUserId || !$objMessage->id) return $this->makeStandardError('Ошибка');
		
		$updatedField = '';
		
		if($objMessage->getField('ID_user') == $currentUserId) $updatedField = 'del_by_user';
		elseif($objMessage->getField('ID_user_to') == $currentUserId) $updatedField = 'del_by_user_to';
		
		// Если в $updatedField ничего не записалось, значит пользователь, пытающийся удалить сообщение не имеет к нему никакого отношения - шалит
		if($updatedField == '') return $this->makeStandardError('Ошибка');
		
		if($objMessage->updateFields(array($updatedField => 1))) $this->arrReturn = array('result' => 'OK');
	}
	
	/**
	 * Сохраняет новое сообщение
	 */
	private function actionNewMessage() {
		$objDB = Service_Database::instanse();
		$text = isset($_POST['text']) ? Service_Escape::absolutelyEscapeString($_POST['text']) : '';
		$idUserTo = isset($_POST['to']) ? Service_Escape::absolutelyEscapeString($_POST['to']) : '';
		$currentUser = User_Seance::getUser();
	
		if (empty($text) || empty($idUserTo) || !$currentUser->id) return $this->makeStandardError('Не получены данные');
		
		$objUser = new User_User($idUserTo);
		if(!$objUser->id) return $this->makeStandardError('Нельзя');
		
		$objMessage = new Message(array('text' => $text, 'ID_user_to' => $idUserTo));
		
		if($objMessage->save()) {
			$newMessageBlock = '<div class="mess-item" mess-num="' . $objMessage->id . '" style="display: none;">';
			$newMessageBlock .= '<div class="mess-from"><div class="name_from"><a href="' . W_ABSPATH . 'id' . $currentUser->id . '">' . $currentUser->getField('first_name') . ' ' . $currentUser->getField('last_name') . '</a></div>';
			$newMessageBlock .= '<div class="mess-date gr-text">' . Service_Date::changeDateFormat($objMessage->getField('created_at'), 'Y-m-d H-i-s', 'j r Y в G:i') . '</div></div>';
			$newMessageBlock .= '<div class="mess-text">' . $objMessage->getField('text') . '</div><div class="mess-actions"><div class="act-item"><a href="#" class="del-mess">Удалить</a></div></div><div class="clear"></div></div>';
			$this->arrReturn = array('result' => 'OK', 'newMessBlock' => $newMessageBlock);
		}
		else return $this->makeStandardError('Ошибка при сохранении');
	}
	
}
?>